home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / comm2 / mmmsg140.lha / REXX / MM_MsgTrack.rexx
OS/2 REXX Batch file  |  1996-04-26  |  19KB  |  685 lines

  1. /*
  2. ** $VER: MM_MsgTrack 1.40 (12.04.96)
  3. **
  4. ** Written by Paolo Carotenuto
  5. **
  6. */
  7. DROP MM.
  8. MM.PathCfg='MM:Config/'
  9. MM.PrgName='MM_MsgTrack v1.40'
  10. MM.Copyright='(C) 1994-96 Paolo Carotenuto'
  11. MM.LogLevel=2
  12. ADDRESS 'MAILMANAGER'
  13. CALL WriteLog(MM.PrgName 'Started')
  14. CALL ReadConfig()
  15. CALL WriteLog('Found' MM.Mails.Count 'Mail Areas to Check')
  16. DO i=0 FOR MM.Mails.Count
  17. MM.Mail=MM.Mails.i
  18. MM_SearchMsgs MM.Mail Messages '#?' '#?' '#?' IMP !SENT
  19. CALL WriteLog('  Found' Messages.Count 'Messages to Check in Area ['MM.Mail']')
  20. DO t=0 FOR Messages.Count
  21. MM.Message=Messages.t
  22. MM_ReadMsg MM.Mail MM.Message MM.Msg
  23. IF Rc ~=0 THEN ITERATE
  24. CALL Init()
  25. IF CheckEmpty()=TRUE THEN ITERATE
  26. IF CheckBad(MM.FromNode,MM.ToNode,MM.FromName,MM.ToName)=TRUE THEN ITERATE
  27. CALL ReMapName(MM.ToName,MM.ToNode)
  28. CALL ReMap(MM.ToNode)
  29. IF CheckExclude(MM.FromName,MM.FromNode)='TRUE' THEN ITERATE
  30. IF INDEX(MM.Msg.Flags,'INTR') ~=0 THEN;DO
  31. IF MM.FromDomain ~=MM.ToDomain THEN;DO
  32. CALL ProcessaMsg('CROSS_NET')
  33. ITERATE
  34. END
  35. MM_SearchInStem MM.Domain Resp MM.FromDomain STR
  36. IF Resp.Count=0 THEN;DO
  37. CALL ProcessaMsg('UNKNOWN_NET')
  38. ITERATE
  39. END
  40. MM.AddrFrom=CheckAddress(MM.FromNode)
  41. MM.AddrTo=CheckAddress(MM.ToNode)
  42. SELECT
  43. WHEN MM.AddrFrom=FALSE&MM.AddrTo=FALSE THEN;DO
  44. CALL ProcessaMsg('INCREDIBILE')
  45. ITERATE
  46. END
  47. WHEN MM.AddrTo=FALSE THEN CALL ProcessaMsg('BOUNCED')
  48. WHEN MM.AddrFrom=FALSE THEN CALL ProcessaMsg('UNKNOWN_SENDER')
  49. OTHERWISE IF CheckPGP(MM.FromNode)=FALSE THEN CALL LogsDom('Message Okay!')
  50. END
  51. END
  52. ELSE;DO
  53. IF CheckMyAddress(MM.ToNode)=TRUE THEN;DO
  54. CALL LogsDom('Checking for RRR Flag')
  55. IF INDEX(MM.Msg.Flags,'RRR') ~=0 THEN CALL ProcessaMsg('RECEIPT_REQUEST')
  56. END
  57. ELSE CALL LogsDom('Message Okay!')
  58. END
  59. IF MM.WriteLog=TRUE THEN;DO
  60. IF MM.LogFile ~='' THEN;DO
  61. MM_WriteStem MM.LogFile MM.Log 'APPEND'
  62. MM.Log.Count=0
  63. END
  64. DO k=0 FOR MM.LogDomain.Count
  65. PARSE VALUE UPPER(MM.LogDomain.k) WITH Log_Domain Log_File .
  66. IF MM.Log_Domain.Count>0 THEN;DO
  67. MM_WriteStem Log_File MM.Log_Domain 'APPEND'
  68. MM.Log_Domain.Count=0
  69. END
  70. END
  71. END
  72. END
  73. END
  74. CALL WriteLog(MM.PrgName 'Ended')
  75. IF MM.WriteLog=FALSE THEN;DO
  76. IF MM.LogFile ~='' THEN;DO
  77. MM_WriteStem MM.LogFile MM.Log 'APPEND'
  78. END
  79. DO k=0 FOR MM.LogDomain.Count
  80. PARSE VALUE UPPER(MM.LogDomain.k) WITH Log_Domain Log_File .
  81. IF MM.Log_Domain.Count>0 THEN;DO
  82. MM_WriteStem Log_File MM.Log_Domain 'APPEND'
  83. END
  84. END
  85. END
  86. EXIT 0
  87. WriteStatus:PROCEDURE EXPOSE MM.
  88. PARSE ARG NumMsg
  89. IF MM.LogLevels>=1 THEN;DO
  90. CALL LogsDom('.')
  91. CALL LogsDom('Processing Message #'NumMsg '( 'MM.Msg.Flags')')
  92. END
  93. IF MM.LogLevels>=2 THEN;DO
  94. CALL LogsDom('  From: 'MM.FromNode '('MM.FromName')')
  95. CALL LogsDom('    To: 'MM.ToNode '('MM.ToName')')
  96. END
  97. IF MM.LogLevels>=3 THEN;DO
  98. CALL LogsDom('  Subj: 'MM.Subj)
  99. END
  100. IF MM.LogLevels>=4 THEN;DO
  101. CALL LogsDom('  Date: 'MM.Date)
  102. END
  103. RETURN
  104. LogsDom:PROCEDURE EXPOSE MM.
  105. PARSE ARG Testo
  106. CALL WriteLog(Testo)
  107. DO k=0 FOR MM.LogDomain.Count
  108. IF WORD(MM.LogDomain.k,1)=UPPER(MM.FromDomain) THEN;DO
  109. PARSE VALUE UPPER(MM.LogDomain.k) WITH DomainLog .
  110. Testo=LogDate() '-' Testo
  111. MM_AddToStem MM.DomainLog 'Testo'
  112. LEAVE
  113. END
  114. END
  115. RETURN
  116. CheckEmpty:PROCEDURE EXPOSE MM.
  117. DO l=0 FOR MM.TwitList.Count
  118. MM.Look.0=MM.FromName
  119. Name=STRIP(MM.TwitList.l)
  120. MM_SearchInStem MM.Look 'Resp' Name STR
  121. IF Resp.Count>0 THEN;DO
  122. IF MM.Msg.Text.Count=0|MM.KillNoEmpty=TRUE THEN;DO
  123. CALL LogsDom('--> Message Found in Twit List -> DELETED!')
  124. IF MM.DlgUser=TRUE THEN;DO
  125. Flags='DEL'
  126. MM_EditMsgFlags MM.Mail MM.Message 'Flags'
  127. END
  128. ELSE MM_DeleteMsg MM.Mail MM.Message
  129. RETURN TRUE
  130. END
  131. END
  132. END
  133. RETURN FALSE
  134. StripDomain:PROCEDURE EXPOSE MM.
  135. PARSE UPPER ARG Address '@' Domain
  136. RETURN Domain
  137. CheckAddress:PROCEDURE EXPOSE MM.
  138. PARSE ARG Addr '.'
  139. MM_GetNodelistNode Addr Info
  140. IF RC=5 THEN;DO
  141. CALL WriteLog('*** Error: Can`not open Traplist.library')
  142. EXIT
  143. END
  144. IF Rc=4 THEN RETURN FALSE
  145. RETURN TRUE
  146. CheckMyAddress:PROCEDURE EXPOSE MM.
  147. PARSE ARG Addr
  148. MM_GetAddrs Nodi
  149. MM_SearchInStem Nodi Resp Addr'#?' STR
  150. IF Resp.Count>0 THEN RETURN TRUE
  151. RETURN FALSE
  152. NodeLists:PROCEDURE EXPOSE MM.
  153. MM.Lista=''
  154. End= d2c('0')
  155. IF EXISTS(MM.Path.NodelistDir'Fidonet.index') THEN;DO
  156. OPEN('TMP',MM.Path.NodelistDir'Fidonet.index','R')
  157. Nodelist.Count=C2D(READCH('TMP',4))
  158. DO k=1 FOR Nodelist.Count
  159. Nodelist=READCH('TMP',108)
  160. Nodelist=TRANSLATE(Nodelist," ",End)
  161. Nodelist.k=STRIP(Nodelist,T)
  162. MM.Lista=MM.Lista Nodelist.k','
  163. END
  164. MM.Lista=LEFT(MM.Lista,LENGTH(MM.Lista)-1)
  165. CLOSE('TMP')
  166. END
  167. ELSE MM.Lista='The Last Nodelist'
  168. RETURN
  169. ProcessaMsg:PROCEDURE EXPOSE MM.
  170. PARSE ARG Tipo
  171. SELECT
  172. WHEN Tipo='CROSS_NET' THEN;DO
  173. CALL LogsDom('--> Domains are Crossed!!')
  174. CALL MoveInBad('Domains are Crossed!!')
  175. DO p=0 FOR MM.CrossNet.Count
  176. CALL AddLine(Converte(MM.CrossNet.p))
  177. END
  178. CALL WriteText()
  179. CALL AddVia()
  180. CALL SaveBody()
  181. CALL WriteMsg('NetWork are Crossed',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
  182. CALL MarkSent()
  183. RETURN
  184. END
  185. WHEN Tipo='UNKNOWN_NET' THEN;DO
  186. CALL LogsDom('--> This Domain is Unknown!!')
  187. CALL MoveInBad('This Domain is Unknown!!')
  188. DO p=0 FOR MM.UnknownNet.Count
  189. CALL AddLine(Converte(MM.UnknownNet.p))
  190. END
  191. CALL WriteText()
  192. CALL AddVia()
  193. CALL SaveBody()
  194. CALL WriteMsg('This NetWork is Unknown',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
  195. CALL MarkSent()
  196. RETURN
  197. END
  198. WHEN Tipo='INCREDIBILE' THEN;DO
  199. CALL LogsDom(' --> Incredible Source & Destination does not exist!!')
  200. CALL MoveInBad('Incredible Source & Destination does not exist!!')
  201. CALL MarkSent()
  202. RETURN
  203. END
  204. WHEN Tipo='BOUNCED' THEN;DO
  205. CALL Nodelists()
  206. CALL LogsDom('--> Destination node is Unknown!!')
  207. CALL MoveInBad('Destination node is Unknown!!')
  208. DO p=0 FOR MM.Bounced.Count
  209. CALL AddLine(Converte(MM.bounced.p))
  210. END
  211. CALL WriteText()
  212. CALL AddVia()
  213. CALL SaveBody()
  214. CALL WriteMsg('Destination node is Unknown',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
  215. CALL MarkSent()
  216. RETURN
  217. END
  218. WHEN Tipo='RECEIPT_REQUEST' THEN;DO
  219. CALL LogsDom('--> Found  "Return Receipt Request"')
  220. DO p=0 FOR MM.Receipt.Count
  221. CALL AddLine(Converte(MM.Receipt.p))
  222. END
  223. CALL AddVia()
  224. CALL SaveBody()
  225. CALL WriteMsg('Your requested reciept',MM.Sysop,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
  226. RETURN
  227. END
  228. WHEN Tipo='UNKNOWN_SENDER' THEN;DO
  229. CALL Nodelists()
  230. CALL LogsDom('--> Source node is Unknown!!')
  231. CALL MoveInBad('Source node is Unknown!!')
  232. DO p=0 FOR MM.UnknownSender.Count
  233. CALL AddLine(Converte(MM.UnknownSender.p))
  234. END
  235. CALL WriteText()
  236. CALL AddVia()
  237. CALL SaveBody()
  238. CALL WriteMsg('Source node is Unknown',MM.PrgName,MM.Addr,MM.ToName,MM.ToNode,'EDIT',MM.Mail)
  239. RETURN
  240. END
  241. OTHERWISE NOP
  242. END
  243. RETURN
  244. SaveBody:PROCEDURE EXPOSE MM.
  245. MM.EndBody.Count=0
  246. DO m=0 FOR MM.Body.Count
  247. Testo=Converte(MM.Body.m)
  248. MM_AddToStem MM.EndBody 'Testo'
  249. END
  250. MM_WriteStem 'T:MM.Body.Tmp' MM.EndBody
  251. MM.Body.Count=0
  252. RETURN
  253. AddVia:PROCEDURE EXPOSE MM.
  254. CALL AddLine('')
  255. CALL AddLine('-+-' MM.PrgName '-' MM.Copyright)
  256. CALL AddLine('')
  257. CALL AddLine('1'X||'Via Node' MM.Addr'  'MM.RecDate'  'TIME()' ('MM.PrgName')')
  258. RETURN
  259. AddLine:PROCEDURE EXPOSE MM.
  260. PARSE ARG Line
  261. Cont=MM.Body.Count
  262. MM.Body.Cont=Line
  263. MM.Body.Count=Cont+1
  264. RETURN
  265. CheckExclude:PROCEDURE EXPOSE MM.
  266. PARSE ARG Name,Address
  267. MM.Look.0=TRANSLATE(Name,"_"," ")
  268. DO i=0 FOR MM.ExcludeName.Count
  269. MM_SearchInStem MM.Look Resp MM.ExcludeName.i STR
  270. IF Resp.Count>0 THEN;DO
  271. CALL LogsDom('The sender of the message is found in Exclude List -> Skipped! ')
  272. RETURN 'TRUE'
  273. END
  274. END
  275. MM.Look.0=Address
  276. DO i=0 FOR MM.ExcludeNode.Count
  277. MM_SearchInStem MM.Look Resp MM.ExcludeNode.i STR
  278. IF Resp.Count>0 THEN;DO
  279. CALL LogsDom('The sender of the message is found in Exclude List -> Skipped! ')
  280. RETURN 'TRUE'
  281. END
  282. END
  283. RETURN 'FALSE'
  284. CheckPGP:PROCEDURE EXPOSE MM.
  285. PARSE ARG MM.Look.0
  286. DO i=0 FOR MM.CheckPGP.Count
  287. MM_SearchInStem MM.Look Resp MM.CheckPGP.i STR
  288. IF Resp.Count>0 THEN;DO
  289. CALL LogsDom('The Sender Of The Message is Found in CheckPGP List -> Checking! ')
  290. IF MM.CheckPGPMsg=TRUE THEN;DO
  291. IF FoundPGP('"#?BEGIN PGP MESSAGE#?"')=TRUE THEN RETURN TRUE
  292. END
  293. IF MM.CheckPGPTxt=TRUE THEN;DO
  294. IF FoundPGP('"#?BEGIN PGP TEXT#?"')=TRUE THEN RETURN TRUE
  295. END
  296. IF MM.CheckPGPKey=TRUE THEN;DO
  297. IF FoundPGP('"#?BEGIN PGP PUBLIC KEY BLOCK#?"')=TRUE THEN RETURN TRUE
  298. END
  299. END
  300. END
  301. RETURN FALSE
  302. FoundPGP:PROCEDURE EXPOSE MM.
  303. PARSE ARG TextPGP
  304. MM_SearchInStem MM.Msg.Text Resp TextPGP STR
  305. IF Resp.Count>0 THEN;DO
  306. CALL LogsDom(' --> Detected PGP Message')
  307. DO p=0 FOR MM.PGPMessage.Count
  308. CALL AddLine(Converte(MM.PGPMessage.p))
  309. END
  310. CALL AddVia()
  311. CALL SaveBody()
  312. CALL WriteMsg('Detected PGP Message',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
  313. CALL MarkSent()
  314. RETURN TRUE
  315. END
  316. RETURN FALSE
  317. MarkSent:PROCEDURE EXPOSE MM.
  318. IF MM.DlgUser=TRUE THEN;DO
  319. NewValue='SENT DEL'
  320. MM_EditMsgFlags MM.Mail MM.Message 'NewValue'
  321. MM_ReadMsg MM.Mail MM.Message Messaggio
  322. IF INDEX(Messaggio.Flags,'SENT')=0 THEN;DO
  323. CALL LogsDom('** ERROR!! Sending Message to Paolo Carotenuto')
  324. END
  325. END
  326. ELSE MM_DeleteMsg MM.Mail MM.Message
  327. RETURN
  328. ReMapName:PROCEDURE EXPOSE MM.
  329. PARSE ARG Name,Address
  330. DO i=0 FOR MM.ReMapName.Count
  331. PARSE VAR MM.ReMapName.i Nome Akas
  332. IF UPPER(TRANSLATE(STRIP(Name),"_"," "))=UPPER(STRIP(Nome)) THEN;DO
  333. DO WHILE Akas ~=''
  334. PARSE VAR Akas Aka Akas
  335. IF STRIP(StripDomain(Address))=STRIP(StripDomain(Aka)) THEN;DO
  336. IF Address ~=Aka THEN;DO
  337. Mess.ToAddr=Aka
  338. MM.ToNode=Aka
  339. MM_EditMsg MM.Mail MM.Message Mess
  340. CALL LogsDom('--> ReMapping Message For:' Name 'To' Aka)
  341. END
  342. RETURN
  343. END
  344. END
  345. END
  346. END
  347. RETURN
  348. CheckBad:PROCEDURE EXPOSE MM.
  349. PARSE ARG FromAddr,ToAddr,FromName,ToName
  350. MM.Look.0=FromAddr
  351. DO i=0 FOR MM.BadFromAddr.Count
  352. PARSE VAR MM.BadFromAddr.i BadFromNodo Mode
  353. BadFromNodo=STRIP(BadFromNodo)
  354. MM_SearchInStem MM.Look Resp BadFromNodo STR
  355. IF Resp.Count>0 THEN;DO
  356. CALL LogsDom('The Sender of the message is found in Bad List...')
  357. IF STRIP(Mode)='REPLY' THEN;DO
  358. DO p=0 FOR MM.BadMessage.Count
  359. CALL AddLine(Converte(MM.BadMessage.p))
  360. END
  361. CALL WriteText()
  362. CALL AddVia()
  363. CALL SaveBody()
  364. CALL WriteMsg('Bad Message',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
  365. CALL MarkSent()
  366. END
  367. ELSE;DO
  368. CALL MarkSent()
  369. CALL MoveInBad('The Sender of the message is found in Bad List')
  370. END
  371. RETURN 'TRUE'
  372. END
  373. END
  374. MM.Look.0=FromTo
  375. DO i=0 FOR MM.BadToAddr.Count
  376. PARSE VAR MM.BadToAddr.i BadToNodo Mode
  377. BadToNodo=STRIP(BadToNodo)
  378. MM_SearchInStem MM.Look Resp BadToNodo STR
  379. IF Resp.Count>0 THEN;DO
  380. CALL LogsDom('The Destination of the message is found in Bad List...')
  381. IF STRIP(Mode)='REPLY' THEN;DO
  382. DO p=0 FOR MM.BadMessage.Count
  383. CALL AddLine(Converte(MM.BadMessage.p))
  384. END
  385. CALL WriteText()
  386. CALL AddVia()
  387. CALL SaveBody()
  388. CALL WriteMsg('Bad Message',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
  389. CALL MarkSent()
  390. END
  391. ELSE;DO
  392. CALL MarkSent()
  393. CALL MoveInBad('The Destination of the message is found in Bad List')
  394. END
  395. RETURN 'TRUE'
  396. END
  397. END
  398. MM.Look.0=TRANSLATE(FromName,"_"," ")
  399. DO i=0 FOR MM.BadFrom.Count
  400. PARSE VAR MM.BadFrom.i BadFromName Mode
  401. BadFromName=STRIP(BadFromName)
  402. MM_SearchInStem MM.Look Resp BadFromName STR
  403. IF Resp.Count>0 THEN;DO
  404. CALL LogsDom('The Sender of the message is found in Bad List....')
  405. IF STRIP(Mode)='REPLY' THEN;DO
  406. DO p=0 FOR MM.BadMessage.Count
  407. CALL AddLine(Converte(MM.BadMessage.p))
  408. END
  409. CALL WriteText()
  410. CALL AddVia()
  411. CALL SaveBody()
  412. CALL WriteMsg('Bad Message',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
  413. CALL MarkSent()
  414. END
  415. ELSE;DO
  416. CALL MarkSent()
  417. CALL MoveInBad('The Sender of the message is found in Bad List')
  418. END
  419. RETURN 'TRUE'
  420. END
  421. END
  422. MM.Look.0=TRANSLATE(ToName,"_"," ")
  423. DO i=0 FOR MM.BadTo.Count
  424. PARSE VAR MM.BadTo.i BadToName Mode
  425. BadToName=STRIP(BadToName)
  426. MM_SearchInStem MM.Look Resp BadToName STR
  427. IF Resp.Count>0 THEN;DO
  428. CALL LogsDom('The Destination of the message is found in Bad List...')
  429. IF STRIP(Mode)='REPLY' THEN;DO
  430. DO p=0 FOR MM.BadMessage.Count
  431. CALL AddLine(Converte(MM.BadMessage.p))
  432. END
  433. CALL WriteText()
  434. CALL AddVia()
  435. CALL SaveBody()
  436. CALL WriteMsg('Bad Message',MM.PrgName,MM.Addr,MM.FromName,MM.FromNode,'WRITE',MM.Mail)
  437. CALL MarkSent()
  438. END
  439. ELSE;DO
  440. CALL MarkSent()
  441. CALL MoveInBad('The Destination of the message is found in Bad List')
  442. END
  443. RETURN 'TRUE'
  444. END
  445. END
  446. RETURN 'FALSE'
  447. MoveInBad:PROCEDURE EXPOSE MM.
  448. PARSE ARG MM.Status
  449. DO u=0 FOR MM.Msg.Head.Count
  450. PARSE UPPER VAR MM.Msg.Head.u Kludge .
  451. IF Kludge='' THEN ITERATE
  452. SELECT
  453. WHEN INDEX(Kludge,'DOMAIN') ~=0 THEN ITERATE
  454. WHEN INDEX(Kludge,'INTL') ~=0 THEN ITERATE
  455. WHEN INDEX(Kludge,'FMPT') ~=0 THEN ITERATE
  456. WHEN INDEX(Kludge,'TOPT') ~=0 THEN ITERATE
  457. WHEN INDEX(Kludge,'MSGID:') ~=0 THEN ITERATE
  458. WHEN INDEX(Kludge,'REPLY:') ~=0 THEN ITERATE
  459. OTHERWISE CALL AddLine(MM.Msg.Head.u)
  460. END
  461. END
  462. CALL AddLine('================================================================================')
  463. CALL AddLine('From Area: 'MM.Mail)
  464. CALL AddLine('   Status: 'MM.Status)
  465. CALL AddLine('================================================================================')
  466. CALL AddLine('')
  467. DO p=0 FOR MM.Msg.Text.Count
  468. CALL AddLine(MM.Msg.Text.p)
  469. END
  470. DO p=0 FOR MM.Msg.Foot.Count
  471. CALL AddLine(MM.Msg.Foot.p)
  472. END
  473. CALL SaveBody()
  474. Move.Subj=MM.Subj
  475. Move.From=MM.FromName
  476. Move.FromAddr=MM.FromNode
  477. Move.To=MM.ToName
  478. Move.ToAddr=MM.ToNode
  479. Move.Flags=MM.Msg.Flags||'HOLD SENT'
  480. Move.File='T:MM.Body.Tmp'
  481. MM_WriteMsg MM.AreaBad Move
  482. CALL WriteLog('  Moving Message to ['MM.AreaBad']')
  483. RETURN
  484. WriteText:PROCEDURE EXPOSE MM.
  485. DO p=0 FOR MM.Msg.Head.Count
  486. CALL AddLine('-> 'TRANSLATE(MM.Msg.Head.p,"^","1"x))
  487. END
  488. DO p=0 FOR MM.Msg.Text.Count
  489. CALL AddLine('->' MM.Msg.Text.p)
  490. END
  491. DO p=0 FOR MM.Msg.Foot.Count
  492. CALL AddLine('-> 'TRANSLATE(MM.Msg.Foot.p,"^","1"x))
  493. END
  494. RETURN
  495. ReadConfig:PROCEDURE EXPOSE MM.
  496. MM.TwitList.Count=0
  497. MM.ExcludeName.Count=0
  498. MM.ExcludeNode.Count=0
  499. MM.CrossNet.Count=0
  500. MM.UnknownNet.Count=0
  501. MM.Bounced.Count=0
  502. MM.UnknownSender.Count=0
  503. MM.Receipt.Count=0
  504. MM.PGPMessage.Count=0
  505. MM.BadMessage.Count=0
  506. MM.Domain.Count=0
  507. MM.Remap.Count=0
  508. MM.RemapName.Count=0
  509. MM.BadTo.Count=0
  510. MM.BadFrom.Count=0
  511. MM.BadToAddr.Count=0
  512. MM.BadFromAddr.Count=0
  513. MM.Look.Count=1
  514. MM.Log.Count=0
  515. MM.LogDomain.Count=0
  516. MM.CheckPGP.Count=0
  517. MM.LogLevels=3
  518. MM.AreaBad=''
  519. MM.LogFile=''
  520. MM.WriteLog=FALSE
  521. MM.DlgUser=FALSE
  522. MM.KillNoEmpty=FALSE
  523. MM.CheckPGPMsg=TRUE
  524. MM.CheckPGPTxt=TRUE
  525. MM.CheckPGPKey=TRUE
  526. MM_ReadStem MM.PathCfg||'MM_MsgTrack.Cfg' Config
  527. IF Rc ~=0 THEN;DO
  528. CALL WriteLog('*** Error: Can not open config "'MM.PathCfg'MM_MsgTrack.cfg"')
  529. EXIT 10
  530. END
  531. DO l=0 FOR Config.Count
  532. IF (LEFT(Config.l,1) ~=';')&Config.l ~='' THEN;DO
  533. PARSE VAR Config.l Keyword Dato
  534. SELECT
  535. WHEN UPPER(Keyword)='#EXCLUDENAME' THEN;DO
  536. Dato=TRANSLATE(STRIP(Dato),"_"," ")
  537. MM_AddToStem MM.ExcludeName 'Dato'
  538. END
  539. WHEN UPPER(Keyword)='#EXCLUDENODE' THEN;DO
  540. Dato=STRIP(Dato)
  541. MM_AddToStem MM.ExcludeNode 'Dato'
  542. END
  543. WHEN UPPER(Keyword)='#LOGDOMAIN' THEN;DO
  544. PARSE VALUE UPPER(Dato) WITH Domains .
  545. MM.Domains.Count=0
  546. Dato=UPPER(STRIP(Dato))
  547. MM_AddToStem MM.LogDomain 'Dato'
  548. END
  549. WHEN UPPER(Keyword)='#CHECKPGPMSG' THEN;DO
  550. IF INDEX(UPPER(Dato),'OFF') ~=0 THEN MM.CheckPGPMsg=FALSE
  551. END
  552. WHEN UPPER(Keyword)='#CHECKPGPTXT' THEN;DO
  553. IF INDEX(UPPER(Dato),'OFF') ~=0 THEN MM.CheckPGPTxt=FALSE
  554. END
  555. WHEN UPPER(Keyword)='#CHECKPGPKEY' THEN;DO
  556. IF INDEX(UPPER(Dato),'OFF') ~=0 THEN MM.CheckPGPKey=FALSE
  557. END
  558. WHEN UPPER(Keyword)='#LOGFILE' THEN MM.LogFile=STRIP(Dato)
  559. WHEN UPPER(Keyword)='#LOGLEVEL' THEN MM.LogLevels=STRIP(Dato)
  560. WHEN UPPER(Keyword)='#BADAREA' THEN MM.AreaBad=STRIP(Dato)
  561. WHEN UPPER(Keyword)='#WRITEIMMEDIATE' THEN MM.WriteLog=TRUE
  562. WHEN UPPER(Keyword)='#DLG' THEN MM.DlgUser=TRUE
  563. WHEN UPPER(Keyword)='#KILLNOEMPTY' THEN MM.KillNoEmpty=TRUE
  564. WHEN UPPER(Keyword)='#REMAPADDR' THEN MM_AddToStem MM.Remap 'Dato'
  565. WHEN UPPER(Keyword)='#REMAPNAME' THEN MM_AddToStem MM.RemapName 'Dato'
  566. WHEN UPPER(Keyword)='#TWITNAME' THEN MM_AddToStem MM.TwitList 'Dato'
  567. WHEN UPPER(Keyword)='#CROSS_NET' THEN MM_AddToStem MM.CrossNet 'Dato'
  568. WHEN UPPER(Keyword)='#UNKNOWN_NET' THEN MM_AddToStem MM.UnknownNet 'Dato'
  569. WHEN UPPER(Keyword)='#BOUNCED' THEN MM_AddToStem MM.Bounced 'Dato'
  570. WHEN UPPER(Keyword)='#UNKNOWN_SENDER' THEN MM_AddToStem MM.UnknownSender 'Dato'
  571. WHEN UPPER(Keyword)='#RECEIPT' THEN MM_AddToStem MM.Receipt 'Dato'
  572. WHEN UPPER(Keyword)='#PGP_MESSAGE' THEN MM_AddToStem MM.PGPMessage 'Dato'
  573. WHEN UPPER(Keyword)='#BAD_REPLY' THEN MM_AddToStem MM.BadMessage 'Dato'
  574. WHEN UPPER(Keyword)='#CHECKPGPNODE' THEN MM_AddToStem MM.CheckPGP 'Dato'
  575. WHEN UPPER(Keyword)='#BADTO' THEN MM_AddToStem MM.BadTo 'Dato'
  576. WHEN UPPER(Keyword)='#BADFROM' THEN MM_AddToStem MM.BadFrom 'Dato'
  577. WHEN UPPER(Keyword)='#BADFROMADDR' THEN MM_AddToStem MM.BadFromAddr 'Dato'
  578. WHEN UPPER(Keyword)='#BADTOADDR' THEN MM_AddToStem MM.BadToAddr 'Dato'
  579. OTHERWISE
  580. END
  581. END
  582. END
  583. MM_GetCfgPaths MM.Path
  584. MM_GetAddrs Address
  585. DO i=0 FOR Address.Count
  586. PARSE UPPER VAR Address.i '@' Network
  587. MM_SearchInStem MM.Domain Resp Network STR
  588. IF Resp.Count=0 THEN;DO
  589. MM_AddToStem MM.Domain 'Network'
  590. END
  591. END
  592. MM_GetAreas MM.Mails MAIL
  593. IF MM.Mails.Count>1 THEN;DO
  594. Cont=0
  595. DO b=0 FOR MM.Mails.Count
  596. MM_GetAreaInfo MM.Mails.b Info
  597. PARSE UPPER VAR Info.Addr '@' Domain
  598. IF Domain='VIRTUAL' THEN ITERATE
  599. MM.Mails.Cont=MM.Mails.b
  600. Cont=Cont+1
  601. END
  602. MM.Mails.Count=Cont
  603. END
  604. MM_GetSysop 'MM.Sysop'
  605. PARSE VALUE DATE() WITH Day Month Year .
  606. MM.RecDate= Day Month RIGHT(Year,2)
  607. RETURN
  608. Init:PROCEDURE EXPOSE MM.
  609. MM.Body.Count=0
  610. MM.FromNode=MM.Msg.FromAddr
  611. MM.FromName=MM.Msg.From
  612. MM.FromDomain=StripDomain(MM.Msg.FromAddr)
  613. MM.FromFirst=WORD(MM.Msg.From,1)
  614. MM.ToNode=MM.Msg.ToAddr
  615. MM.ToName=MM.Msg.To
  616. MM.ToDomain=StripDomain(MM.Msg.ToAddr)
  617. MM.Subj=MM.Msg.Subj
  618. MM.Date=MM.Msg.Date
  619. MM_GetNearestAddr MM.FromNode 'MM.Addr'
  620. CALL WriteStatus(MM.Message)
  621. RETURN
  622. WriteMsg:PROCEDURE EXPOSE MM.
  623. PARSE ARG Reply_Subj,Reply_From,Reply_FromAddr,Reply_To,Reply_ToAddr,Reply_Mode,Reply_Area
  624. Reply.Subj=Reply_Subj
  625. Reply.From=Reply_From
  626. Reply.FromAddr=Reply_FromAddr
  627. Reply.To=Reply_To
  628. Reply.ToAddr=Reply_ToAddr
  629. Reply.Flags='PVT'
  630. Reply.File='T:MM.Body.Tmp'
  631. IF Reply_Mode='WRITE' THEN MM_WriteMsg Reply_Area Reply
  632. ELSE;DO
  633. Reply.Flags='!CRASH PVT'
  634. MM_EditMsg Reply_Area MM.Message Reply
  635. END
  636. RETURN
  637. Converte:PROCEDURE EXPOSE MM.
  638. PARSE ARG Data
  639. IF INDEX(Data,'%')=0 THEN RETURN Data
  640. Data=Replace(Data,MM.FromNode,'%FROM_NODE')
  641. Data=Replace(Data,MM.FromDomain,'%FROM_DOMAIN')
  642. Data=Replace(Data,MM.FromName,'%FROM_NAME')
  643. Data=Replace(Data,MM.FromFirst,'%FROM_FIRST')
  644. Data=Replace(Data,MM.ToNode,'%TO_NODE')
  645. Data=Replace(Data,MM.ToDomain,'%TO_DOMAIN')
  646. Data=Replace(Data,MM.ToName,'%TO_NAME')
  647. Data=Replace(Data,MM.Subj,'%SUBJ')
  648. Data=Replace(Data,MM.Date,'%MSG_DATE')
  649. Data=Replace(Data,MM.RecDate,'%REC_DATE')
  650. Data=Replace(Data,MM.Lista,'%LIST')
  651. Data=Replace(Data,MM.Sysop,'%SYSOP')
  652. Data=Replace(Data,MM.Addr,'%NODO')
  653. RETURN Data
  654. LOGDATE:PROCEDURE
  655. Tempo='* 'LEFT(DATE(),LENGTH(DATE())-4)||RIGHT(DATE(),2)'  'TIME()
  656. RETURN Tempo
  657. Replace:PROCEDURE
  658. PARSE ARG Data,New,Old
  659. DO WHILE INDEX(Data,Old) ~=0
  660. INTERPRET "PARSE VAR Data l '"Old"' r"
  661. Data=l||New||r
  662. END
  663. RETURN Data
  664. ReMap:PROCEDURE EXPOSE MM.
  665. PARSE ARG Nodo
  666. DO y=0 FOR MM.Remap.Count
  667. PARSE VAR MM.Remap.y FromNodo ToNodo
  668. IF UPPER(STRIP(FromNodo))=UPPER(Nodo) THEN;DO
  669. ToNodo=STRIP(ToNodo)
  670. CALL LogsDom('Remapping Message from: 'Nodo' to: 'ToNodo)
  671. Mgs.ToAddr=ToNodo
  672. MM.ToNode=ToNodo
  673. MM_EditMsg MM.Mail MM.Message Mgs
  674. RETURN
  675. END
  676. END
  677. RETURN
  678. WriteLog:PROCEDURE EXPOSE MM.
  679. PARSE ARG Testo
  680. MM_WriteLog 'Testo' MM.LogLevel
  681. IF MM.LogFile ~='' THEN;DO
  682. Testo=LogDate() '-' Testo
  683. MM_AddToStem MM.Log 'Testo'
  684. END
  685. RETURN